1、平台设备框架
	在Linux系统中要使用总线设备驱动框架就必须要有总线、设备和设备驱动，而一些外设却没有实际的物理总线，为了
方便这些设备使用总线设备驱动框架，linux系统提供了platform(平台)总线，platform(平台)总线是一条虚拟总线，其目
的是为了让没有具体物理总线的设备能够使用总线设备驱动框架
2、平台设备
	Linux内核中用 struct platform_device 描述一个平台设备，其核心成员如下：
		const char *name;			//平台设备名称
		char *driver_override;		//用于设备和驱动的强制匹配
		int id;						//平台设备ID，用于区分不同的平台设备
		struct device dev;			//继承于device对象
		u32 num_resources;			//资源数量
		struct resource *resource;	//资源列表，使用设备树时会自动将设备树描述的中断资源和寄存器资源转换
									//为资源列表
	平台设备相关函数：
		platform_device_register	//注册平台设备
		platform_device_unregister	//注销平台设备
3、平台设备资源
	结构体 struct resource 用于描述平台设备的资源，其核心成员如下：
		resource_size_t start;							//资源起始
		resource_size_t end;							//资源结束
		const char *name;								//资源名称
		unsigned long flags;							//资源类型
	常用的资源类型：
		IORESOURCE_MEM			//内存资源
		IORESOURCE_IRQ			//中断资源
		IORESOURCE_DMA			//DMA资源
	初始化资源的宏定义：
		DEFINE_RES_DMA			//初始化DMA资源
		DEFINE_RES_IRQ			//初始化中断资源
		DEFINE_RES_MEM			//初始化内存资源
	资源相关函数：
		platform_get_resource	//获取资源
		resource_size			//获取资源大小
4、平台设备驱动
	Linux内核用 struct platform_driver 表示一个平台驱动，其核心成员如下：
		int (*probe)(struct platform_device *);							//设备和驱动匹配成功执行
		int (*remove)(struct platform_device *);						//设备或驱动卸载时执行
		void (*shutdown)(struct platform_device *);				 		//系统关机前执行
		int (*suspend)(struct platform_device *, pm_message_t state);	//系统进入睡眠状态之前执行
		int (*resume)(struct platform_device *);						//系统从睡眠状态中唤醒系统后执行
		struct device_driver driver;									//继承于device_driver对象
	平台驱动相关函数：
		platform_driver_register		//注册平台驱动
		platform_driver_unregister		//注销平台驱动
		module_platform_driver			//宏定义，用于生成平台设备驱动模块加载和卸载函数
5、平台设备和驱动的匹配
	平台设备和驱动的匹配函数如下：
		static int platform_match(struct device *dev, struct device_driver *drv)
		{
			struct platform_device *pdev = to_platform_device(dev);
			struct platform_driver *pdrv = to_platform_driver(drv);
		
			/* 1、如果平台设备的driver_override不为空则用平台设备的driver_override和平台驱动的name进行匹配 */
			if (pdev->driver_override)
				return !strcmp(pdev->driver_override, drv->name);
		
			/* 2、使用设备数匹配 */
			if (of_driver_match_device(dev, drv))
				return 1;
		
			/* 3、ACPI匹配 */
			if (acpi_driver_match_device(dev, drv))
				return 1;
		
			/* 4、如果平台驱动的id_table不为空则用平台驱动的id_table与平台设备进行匹配 */
			if (pdrv->id_table)
				return platform_match_id(pdrv->id_table, pdev) != NULL;
		
			/* 5、用平台设备的名字与平台驱动的名字进行匹配 */
			return (strcmp(pdev->name, drv->name) == 0);
		}


